package jnpf.database.datatype.limit.util;

import jnpf.database.datatype.db.interfaces.DtInterface;
import jnpf.database.datatype.limit.base.DtLimitModel;
import jnpf.database.datatype.model.DataTypeModel;
import jnpf.database.datatype.model.ViewDtModel;

/**
 * 类功能
 *
 * @author JNPF开发平台组 YanYu
 * @version V3.3
 * @copyright 引迈信息技术有限公司
 * @date 2022-06-06
 */
public class DtLimitUtil {


    /* ============== 转换方式 =============== */
    /*
     * 说明：
     * 1、不可修改转可修改（按默认值）
     * 2、可修改转可修改
     * 3、创建可修改
     *
     * （以下都不进行长度设置）
     * 4、可修改转不可修改
     * 5、不可修改转不可修改
     * 6、创建不可修改
     * */

    /**
     * 不进行长度修改的
     * @param toDtEnum 前端数据类型模型
     * @return 转换数据类型模板
     */
    public static DataTypeModel convertUnModify(DtInterface toDtEnum){
        DataTypeModel dataTypeModel = new DataTypeModel();
        dataTypeModel.setDtEnum(toDtEnum);
        dataTypeModel.setDataType(toDtEnum.getDataType());
        return dataTypeModel;
    }

    /**
     * 数值转换
     * @param viewDtModel 前端数据类型模型
     * @return 转换数据类型模板
     */
    public static DataTypeModel convertNumeric(ViewDtModel viewDtModel){
        DtInterface toDtEnum = viewDtModel.getDtEnum();
        DataTypeModel toModel = convertUnModify(toDtEnum);
        DtLimitModel numPrecisionLm = toDtEnum.getDtLimit().getNumPrecisionLm();
        DtLimitModel numScaleLm = toDtEnum.getDtLimit().getNumScaleLm();
        // 精度、标度：标准化 =========
        if(toDtEnum.getDtLimit().getIsModifyFlag()){
            Integer numPrecision = viewDtModel.getViewNumPrecision();
            Integer numScale = viewDtModel.getViewNumScale();
            // 1：数据库取到的值
            if(viewDtModel.getIsDbDataType()){
                numPrecision = viewDtModel.getViewNumPrecision();
                numScale = viewDtModel.getViewNumScale();
            // 2：使用固定值
            }else if(viewDtModel.getIsFixed()){
                numPrecision = (Integer) numPrecisionLm.getFixed();
                numScale = (Integer) numScaleLm.getFixed();
            // 3：前端传来的参数
            }else {
                // 验证比较
                numPrecision = convertNum(numPrecision, (Integer) numPrecisionLm.getMin(), (Integer) numPrecisionLm.getMax(), (Integer)numPrecisionLm.getDefaults());
                numScale = convertNum(numScale, (Integer) numScaleLm.getMin(), (Integer) numScaleLm.getMax(), (Integer)numScaleLm.getDefaults());
            }
            // 数据型设置 =========
            toModel.setNumPrecision(numPrecision);
            toModel.setNumScale(numScale);
            toModel.checkNumLength(numPrecision, numScale);
        }
        return toModel;
    }

    /**
     * 字符转换
     * @param viewDtModel 即将转换的数据类型枚举
     * @return 转换数据类型模板
     */
    public static DataTypeModel convertCharacter(ViewDtModel viewDtModel){
        DtInterface toDtEnum = viewDtModel.getDtEnum();
        DataTypeModel toModel = convertUnModify(toDtEnum);
        DtLimitModel charLengthLm = toDtEnum.getDtLimit().getCharLengthLm();
        // 精度、标度：标准化 =========
        Long charLengthView;
        if(toDtEnum.getDtLimit().getIsModifyFlag()){
            // 1：数据库取到的值
            if(viewDtModel.getIsDbDataType()){
                charLengthView = viewDtModel.getViewCharLength();
            // 2：使用固定值
            }else if(viewDtModel.getIsFixed()){
                charLengthView = (Long)charLengthLm.getFixed();
            // 3：前端传来的参数
            }else {
                // 验证比较
                charLengthView = convertLongNum(viewDtModel.getViewCharLength(), (Long) charLengthLm.getMax(), (Long) charLengthLm.getDefaults());
            }
            // 数据型设置 =========
            toModel.setCharLength(charLengthView);
        }
        return toModel;
    }

    /* ================ */

    /**
     * 获取数值类型显示
     */
    public static void getNumericLength(DataTypeModel model){
        model.setFormatLengthStr(model.getNumPrecision() + "," + model.getNumScale());
    }
    /**
     * 获取字符类型显示
     */
    public static void getCharLength(DataTypeModel model){
        model.setFormatLengthStr(model.getCharLength().toString());
    }

    /* =========== 内部使用算法 =========== */

    /**
     * originNum < [Min, Max] < originNum
     */
    private static Integer convertNum(Integer originNum, Integer toMin, Integer toMax, Integer defaultNum){
        originNum = originNum == null || originNum < toMin ? defaultNum : originNum;
        // 区间内
        if(originNum >= toMin && toMax >= originNum){
            return originNum;
        }else if(originNum > toMax){
            // 大于区间，为保证尽可能数据不丢失，返回最大长度
            return toMax;
        }else {
            return toMin;
        }
    }

    /**
     * charLength 的 Long类型
     * >= 0
     */
    private static Long convertLongNum(Long originNum, Long toMax, Long defaultNum){
        originNum = originNum == null || originNum < 1 ? defaultNum : originNum;
        if(originNum <= toMax){
            return originNum;
        }else{
            return toMax;
        }
    }


}
